package com.gxgeek.javabasic.base.string;

/**
 * Created by gx on 2017/7/10.
 */
public class TestString {
    public static void main(String[] args) {
//        String s1  = "100";
//        String s2  = "100";
//
//        System.out.println(s1==s2);
//
//        String s3 = new String("100");
//        String s4 = new String("100");
//        System.out.println(s3==s4);
//
//        String s5 = new String("101");
//        String s6 = "101";
//        System.out.println(s5==s6);


        String s1=new String("test");//创建2个对象，一个Class和一个堆里面
        String s2="test";//创建1个对象，s2指向pool里面的"test"对象
        String s3="test";//创建0个对象,指向s2指想pool里面的那个对象
        String s4=s2;//创建0个对象,指向s2,s3指想pool里面的那个对象
        String s5=new String("test");//创建1个对象在堆里面，注意，与s1没关系

        System.out.println(s2=="test");//true s2=="test"很明显true
        System.out.println(s2==s3);//true,因为指向的都是pool里面的那个"test"
        System.out.println(s2==s4);//true,同上,那么s3和s4...:)
        System.out.println(s1==s5);//false,很明显,false
        System.out.println(s1==s2);//false,指向的对象不一样,下面再说

        //1,System.out.println(s1==s2);
        // 很明显，s2指向的对象"test"是在pool里面，而s1指向的是堆里面的"test"对象(s1指向的内存区)，所以返回false.
        System.out.println(s1=="test");//false,难道s1!="tset"？下面再说
//        s1指向的是堆里面的"test"对象(s1指向的内存区)，而"test"是程序
//        刚刚建立的(其实是共用pool里面的那个已经创建了的"test"对象,也就是我们s2="test"时候，在pool里面创建的)，
//        所以s1指向的堆 里的"test"对象

        System.out.println("---------------");

        s1=s2;
        //
//      当我们s1=s2;的时候，很明显，把s2的指给了s1,s1指向pool里面的"test",
//      这个时候，s2也指向了pool里面的"test"对 象了，
//      当System.out.println(s1=="test")时候，java虚拟机创建"test"对象，
//      注意，其实没创建，和前面讲的一 样，公用s1="test"创建的"test"对象(pool里面的),
//      所以，s1=="test"(pool里面的)，同 样，s1=s2=s3=s4！

        System.out.println(s1=="test");//true,下面说

    }
}
